package com.shujia.spark.core

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object Demo19Exe {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()

    conf.setAppName("acc")

    conf.setMaster("local")

    val sc = new SparkContext(conf)

    val studentsRDD: RDD[String] = sc.textFile("data/students.txt")

    /**
     * 再spark中写代码需要注意的问题
     *
     */

    /**
     * 1、在算子内不能修改算子外的一个普通变量
     */
    var count = 0

    val mapRDD: RDD[String] = studentsRDD.map((stu: String) => {

      //在算子内修改算子外的一个普通变量不会生效
      count += 1
      println(count)

      stu
    })

    mapRDD.foreach(println)

    println(s"count:$count")

    /**
     * 2、算子不能嵌套使用,  在算子内不能使用rdd， 在算子内只能使用scala api
     *
     */

    /*
        studentsRDD.foreach((stu: String) => {
          println(stu)
          studentsRDD.foreach((i: String) => {
            println(i)
          })
        })
    */


    /**
     * 3、在算子内不能使用SparkContext  -- 在算子内不能使用算子外一个不能被序列化的对象（没有实现Serializable接口的类都不能序列化）
     * 常见的不能序列化的对象（网络链接）
     *
     */
    studentsRDD.foreach((stu: String) => {
      val score: RDD[String] = sc.textFile("data/score.txt")
      score.foreach(println)
    })

  }

}
